package com.ly1.aicosplay.service;

import com.ly1.aicosplay.domain.po.Character;
import com.ly1.aicosplay.config.CharacterFactory;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class AiService {
    
    @Autowired
    private ChatModel chatModel;
    
    @Autowired
    private CharacterFactory characterFactory;
    
    /**
     * 与角色进行文本对话
     * @param characterId 角色ID
     * @param message 用户消息
     * @return AI回复
     */
    public String chatWithCharacter(String characterId, String message) {
        Character character = characterFactory.getCharacterById(characterId);
        if (character == null) {
            throw new RuntimeException("角色不存在");
        }
        
        // 构建角色扮演的提示词
        String systemPrompt = buildCharacterPrompt(character);
        
        // 创建消息列表，包含系统提示和用户消息
        List<Message> messages = new ArrayList<>();
        messages.add(new SystemMessage(systemPrompt));
        messages.add(new UserMessage(message));
        
        // 调用AI模型
        Prompt prompt = new Prompt(messages);
        ChatResponse response = chatModel.call(prompt);
        String reply = response.getResult().getOutput().getText();
        
        return reply != null ? reply : "...";
    }
    
    /**
     * 构建角色扮演提示词
     * @param character 角色对象
     * @return 系统提示词
     */
    private String buildCharacterPrompt(Character character) {
        StringBuilder prompt = new StringBuilder();
        prompt.append("你现在扮演的角色是: ").append(character.getName()).append("\n");
        prompt.append("角色描述: ").append(character.getDescription()).append("\n");
        prompt.append("背景故事: ").append(character.getBackground()).append("\n");
        prompt.append("性格特点: ").append(character.getPersonality()).append("\n");
        prompt.append("特殊技能: ");
        if (character.getSpecialSkills() != null) {
            prompt.append(String.join(", ", character.getSpecialSkills()));
        }
        prompt.append("\n");
        prompt.append("请以该角色的身份和用户对话，保持角色一致性。");
        
        return prompt.toString();
    }
    
    /**
     * 文本转语音
     * @param text 文本内容
     * @return 语音数据
     */
    public byte[] textToSpeech(String text) {
        // TODO: 实现文本转语音功能
        return new byte[0];
    }
    
    /**
     * 语音识别
     * @param audioData 语音数据
     * @return 识别后的文本
     */
    public String speechToText(byte[] audioData) {
        // TODO: 实现语音识别功能
        return null;
    }
    
    /**
     * 加载角色配置
     * @param characterId 角色ID
     * @return 角色配置
     */
    public Character loadCharacter(String characterId) {
        return characterFactory.getCharacterById(characterId);
    }
}